//
// Created by 86156 on 25-8-27.
//

#include "rc_driver.h"

uint8_t sbus_rx_buffer[RC_DATA_LENGTH];
RC_Ctl_t RC_Ctl;
RC_Ctl_t RC_Ctl_last;
void Rc_Start()
{
    HAL_UARTEx_ReceiveToIdle_DMA(&huart3,sbus_rx_buffer,RC_DATA_LENGTH);
    __HAL_DMA_DISABLE_IT(huart3.hdmarx,DMA_IT_HT);//禁用中断，保证完整稳定传输
}

void RCData_Process(RC_Ctl_t * RC_Ctl,unsigned char sbus_rx_buffer[])
{
    //数据解算
    RC_Ctl->rc.ch0 = (sbus_rx_buffer[0]| (sbus_rx_buffer[1] << 8)) & 0x07ff; //!< Channel 0
    RC_Ctl->rc.ch1 = ((sbus_rx_buffer[1] >> 3) | (sbus_rx_buffer[2] << 5)) & 0x07ff; //!< Channel 1
    RC_Ctl->rc.ch2 = ((sbus_rx_buffer[2] >> 6) | (sbus_rx_buffer[3] << 2) | (sbus_rx_buffer[4] << 10)) & 0x07ff;//!< Channel 2
    RC_Ctl->rc.ch3 = ((sbus_rx_buffer[4] >> 1) | (sbus_rx_buffer[5] << 7)) & 0x07ff; //!< Channel 3
    RC_Ctl->rc.s1 = ((sbus_rx_buffer[5] >> 4)& 0x000C) >> 2; //!< Switch left
    RC_Ctl->rc.s2 = ((sbus_rx_buffer[5] >> 4)& 0x0003); //!< Switch right
    RC_Ctl->Rc_Dog.rc_dog=0;
}

void RC_dog_init()//防止电机未开控时转动
{
    RC_Ctl.Rc_Dog.rc_dog=1;
}

bool Rc_CRC()//数据校验函数，CRC
{
    if((RC_Ctl.rc.s2!=1)&&(RC_Ctl.rc.s2!=2)&&(RC_Ctl.rc.s2!=3))
    {
        return false;
    }
    if((RC_Ctl.rc.s1!=1)&&(RC_Ctl.rc.s1!=2)&&(RC_Ctl.rc.s1!=3))
    {
        return false;
    }
    if((RC_Ctl.rc.ch1<RC_CH_VALUE_MIN)||(RC_Ctl.rc.ch1>RC_CH_VALUE_MAX))
    {
        return false;
    }
    if((RC_Ctl.rc.ch2<RC_CH_VALUE_MIN)||(RC_Ctl.rc.ch2>RC_CH_VALUE_MAX))
    {
        return false;
    }
    if((RC_Ctl.rc.ch3<RC_CH_VALUE_MIN)||(RC_Ctl.rc.ch3>RC_CH_VALUE_MAX))
    {
        return false;
    }
    if((RC_Ctl.rc.ch0<RC_CH_VALUE_MIN)||(RC_Ctl.rc.ch0>RC_CH_VALUE_MAX))
    {
        return false;
    }
    if(RC_Ctl.Rc_Dog.rc_dog>10)
    {
        return false;
    }
    __NOP();
    return true;
}

void RCData_back_one()
{
    RC_Ctl.back_one.channel0=(float)(RC_Ctl.rc.ch0-1024)/660;
    RC_Ctl.back_one.channel1=(float)(RC_Ctl.rc.ch1-1024)/660;
    RC_Ctl.back_one.channel2=(float)(RC_Ctl.rc.ch2-1024)/660;
    RC_Ctl.back_one.channel3=(float)(RC_Ctl.rc.ch3-1024)/660;
}